</> 技術筆記Tech Notes

DXCore 系列: 輕鬆搞定 JavaScript 向量運算

在這篇教學中,我們將首先探討向量 (Vector) 的基本數學概念,然後學習如何使用一個功能強大的自訂 向量 JavaScript 類別來輕鬆地執行這些運算。

第一部分:向量的基本運算知識

在物理學和數學中,向量是一個同時具有大小(或長度)和方向的幾何物件。我們通常將一個 n 維向量表示為一個有序的數字列表。

例如,一個三維向量 v 可以寫作 $\vec{v} = (v_1, v_2, v_3)$。

向量的大小(範數)

向量的大小,也稱為範數 (Norm),代表了向量在空間中的長度。最常見的是歐幾里得範數,其計算公式如下:

$$||\vec{v}|| = \sqrt{v_1^2 + v_2^2 + … + v_n^2}$$

這個公式計算了向量各分量平方和的平方根。

向量加法

兩個維度相同的向量可以相加。加法是將兩個向量的對應分量相加,從而得到一個新的向量。

$$\vec{u} + \vec{v} = (u_1+v_1, u_2+v_2, …, u_n+v_n)$$

純量乘法

將一個向量乘以一個純量(即一個單獨的數字)會得到一個新的向量,它的方向與原向量相同或相反,但長度發生了變化。運算方式是將向量的每個分量都乘以該純量。

$$c\vec{v} = (cv_1, cv_2, …, cv_n)$$

內積 (Dot Product)

內積,也稱為點積,是兩個維度相同的向量的運算,其結果是一個純量。它的計算方式是將兩個向量的對應分量相乘後再求和。

$$\vec{u} \cdot \vec{v} = \sum_{i=1}^{n} u_i v_i = u_1v_1 + u_2v_2 + … + u_nv_n$$

內積在計算兩個向量之間的夾角、判斷正交性等方面非常有用。

外積 (Cross Product)

外積,也稱為叉積,是僅適用於三維向量的運算,其結果是一個新的三維向量,這個新向量同時垂直於原來的兩個向量。

對於兩個三維向量 $\vec{u} = (u_1, u_2, u_3)$ 和 $\vec{v} = (v_1, v_2, v_3)$,其外積計算公式為:

$$ \begin{align*} \vec{u} \times \vec{v} &= \begin{pmatrix} u_1 \ u_2 \ u_3 \end{pmatrix} \times \begin{pmatrix} v_1 \ v_2 \ v_3 \end{pmatrix} \ &= \begin{pmatrix} u_2v_3 - u_3v_2 \ u_3v_1 - u_1v_3 \ u_1v_2 - u_2v_1 \end{pmatrix} \end{align*} $$


第二部分:使用 向量 類別進行運算

現在我們已經了解了基本的向量數學,讓我們看看如何使用 向量.js 中定義的 向量 類別來實作這些運算。這個類別讓複雜的數學計算變得簡單直觀。

建立向量

首先,我們需要建立 向量 物件。你可以傳入一個陣列,或是一串數字來初始化。

import 向量 from 'dx-core';

// 從一串數字建立向量
const v1 = new 向量(1, 2, 3);
console.log(v1); // 輸出: [1, 2, 3]

// 從陣列建立向量
const v2 = new 向量([4, 5, 6]);
console.log(v2); // 輸出: [4, 5, 6]

// 建立一個長度為 4,並以 0 填充的向量
const zeroVector = new 向量(4);
console.log(zeroVector); // 輸出: [0, 0, 0, 0]

計算向量大小 (範數)

向量 類別提供了一個方便的 範數 屬性來直接取得向量的大小。

const v = new 向量(3, 4);

// 計算範數 ||v|| = sqrt(3^2 + 4^2) = 5
const length = v.範數;

console.log(`向量 (3, 4) 的長度是: ${length}`); // 輸出: 向量 (3, 4) 的長度是: 5

向量加法

使用 加() 方法可以輕鬆完成向量的加法。

const v1 = new 向量(1, 2, 3);
const v2 = new 向量(4, 5, 6);

// 計算 v1 + v2
const sumVector = v1.加(v2);

console.log(sumVector); // 輸出: [5, 7, 9]

純量乘法

使用 乘() 方法可以將向量乘以一個純量。

const v = new 向量(1, 2, 3);

// 計算 3 * v
const scaledVector = v.乘(3);

console.log(scaledVector); // 輸出: [3, 6, 9]

計算內積

使用 內積() 方法來計算兩個向量的點積。

const v1 = new 向量(1, 2, 3);
const v2 = new 向量(4, 5, 6);

// 計算 v1・v2 = (1*4 + 2*5 + 3*6) = 4 + 10 + 18 = 32
const dotProduct = v1.內積(v2);

console.log(`內積結果: ${dotProduct}`); // 輸出: 內積結果: 32

計算外積

外積() 方法專門用於計算三維向量的叉積。如果向量不是三維的,它會拋出一個錯誤。

// X 軸單位向量
const i = new 向量(1, 0, 0);

// Y 軸單位向量
const j = new 向量(0, 1, 0);

// 計算 i x j,結果應為 Z 軸單位向量 (0, 0, 1)
const k = i.外積(j);

console.log(k); // 輸出: [0, 0, 1]

// 嘗試對非三維向量做外積
try {
    const v_2d = new 向量(1, 2);
    v_2d.外積(i);
} catch (error) {
    console.error(error.message); // 輸出: 外積僅能對三維向量做運算
}

其他實用功能

向量 類別還包含了許多其他有用的方法,例如:

  • .等於(otherVector): 判斷兩個向量是否相等。

  • .複製(): 產生一個全新的向量副本,避免修改到原始向量。

  • .最大值() / .最小值(): 尋找向量中的極值。

const v_orig = new 向量(10, 20, 5);
const v_copy = v_orig.複製();
const v_compare = new 向量(10, 20, 5);

console.log(v_orig.等於(v_compare)); // 輸出: true
console.log(v_orig === v_copy); // 輸出: false (因為是不同的物件實例)

const min_info = v_orig.最小值();
console.log(`最小值是 ${min_info.值},在索引 ${min_info.索引}`); // 輸出: 最小值是 5,在索引 2

這份教學介紹了向量的基礎以及如何透過一個設計良好的 JavaScript 類別來應用這些知識。希望這能幫助你更輕鬆地在你的專案中處理向量運算!